;*******************************************************************************************************
;*******************************************************************************************************
;***************************** DOMACI MIPS APRIL 2010******** ******************************************
;*******************************************************************************************************

data1 segment  
    
sec db 0     

PROD_kol db 100 dup(0)          ;Niz sa podacima o kolicini proizvoda
PROD_ime db 1700 dup(0)         ;Niz sa nazivima proizvoda
PROD_cen db 100 dup(0)          ;Niz sa podacima o cenama proizvoda
PROD_money db 100 dup(0)	;Niz sa zaradama proizvoda
PROD_sum_money dw 0		;Ukupna zarada

PROD_char_tmp db 0              ;Koristi se pri citanju imena iz fajla
PROD_num_tmp  db 3 dup(0)       ;Koristi  se pri citanju broja iz fajla
PROD_index_tmp db 0             ;Koristi se da cuva trenutni index u tabeli prizvoda

PROT_current_event db 0        ;poslednji dogadjaj
PROT_current_state db 0        ;trenutno stanje(protokol)
PROT_current_key   db 0          ;Kod onog sto je pritisnuto
PROT_timestamp     db 0
PROT_selected_product db 0FFh    ;trnutno izabrani proizvod; FF znaci da nije izabran nijedan
PROT_product_taken  db 0
PROT_counter dw 0
PROT_my_money dw 0             ;ubacen novac
PROT_10 dw 20                  ;Broj novcanica od 10 dinara
PROT_20 dw 20                  ;Broj novcanica od 20 dinara
PROT_50 dw 20                  ;Broj novcanica od 50 dinara 
PROT_100 dw 20                 ;Broj novcanica od 100 dinara 
PROT_200 dw 20                 ;Broj novcanica od 200 dinara
PROT_connected db 0	       ;Conektovan na kom ili ne 

MISC_spiral_control db 0       ;broj koji kada se menja prouzrokuje da se "spirala" okrece
MISC_pressed_key db 0          ;pritisnuti taster
MISC_the_end     db 0          ;oznacava kraj programa
MISC_module_control db 0
MOD_W db 0
MOD_R db 0
MOD_I db 0
DISP_cur_pos dw 1 dup(0)        ; Trenutna pozicija kursora (index u baferu)
DISP_buffer dw 2000 dup(0720h)  ;Bafer za crtanje (80X25 16-bitnih reci, 1bajt karakter 1 bajt atribut)   
FILE_ascii db "ascii",0
FILE_products db "products.txt",0

MSG_cur_time db "00:00:00",0
MSG_welcome db "--      ",0
MSG_pre_welcome db "",0
MSG_no_product db "NO PRODUCT",0
MSG_no_money db "NOT ENOUGH MONEY",0
MSG_wait db "WAIT",0
MSG_take_change db "SHOP OR TAKE CHANGE",0
MSG_no_change db "NO CHANGE",0
MSG_thanks db "THANK YOU COME AGAIN",0


MSG_info1 db "SUM money:         ",0
MSG_info2 db "PRO money:         ",0


MSG_leg0 db "*******************************************************************************",0
MSG_leg1 db "****  TASTERI ZA UNOS NOVCANICA:                     *********  U - CONNECT   *",0
MSG_leg2 db "****  S-10din, D-20din, F-50din, G-100din, H-200din  **************************",0  
MSG_leg3 db "*******************************************************************************",0
MSG_leg6 db "****  TASTERI TASTATURE:                             **************************",0 
MSG_leg7 db "****  0-9 BROJEVI,   A-ENTER,   R-DEL,  C-CHANGE     ********* T - DISCONNECT *",0
MSG_leg8 db "*******************************************************************************",0
MSG_leg9 db "************************** AUTOMAT ZA SLATKISE ********************************",0
MSG_spiral_turning1 db "* ** *** **** *****",0
MSG_spiral_turning2 db "                   ",0
DISP_page_v db 1 dup(0)         ; Stranica koja je trenutno vidljiva (0 ili 1)
DISP_page_r db 1 dup(1)         ; Stranica na kojoj se trenutno crta (1 ili 0)
DISP_cur_attr db 1 dup(0)       ; Trenutni atributi teksta
LEDS_cur_msg dw 1               ;pokazivac na trenutnu poruku
LEDS_ASCII_table dw 59 dup(0)   ;ASCII tabela za displej(sadrzi karaktere od broja 32 do 90)
LEDS_buffer dw 8 dup(0)         ;Niz sa podacima za svaki segment displeja 
LEDS_cur_msg_offset db 1        ;pomeraj u trenutnoj poruci
LEDS_scroll_msg db 1            ;indikator da treba pomerati poruku

data1 ends
stack1 segment
dw 128 dup(0)
stop label word
stack1 ends

code segment
assume cs:code
assume ss:stack1
assume ds:data1
start:
mov ax, data1
mov ds, ax
mov ax, stack1
mov ss, ax
mov sp, offset stop


call init

loopxx: mov ah, 2ch
int 21h
mov al, PROT_timestamp
cmp dl,al
je loopxx 
mov PROT_timestamp,dl
call keyboard_handler
call module_control
call timer_interrupt
call write_components
cmp byte ptr MISC_the_end,0
je loopxx

mov ax, 4c00h ; exit to operating system.
int 21h
ret

init proc near 
    call read_products
    ;setovanje ekrana
    mov al, 03h
    mov ah, 0h
    int 10h
    mov ch, 32
    mov ah, 1
    int 10h
    mov DISP_cur_attr, 0007h             
    ;inicijalizacija ascii tabele
    mov ax, offset FILE_ascii
    push ax
    mov ax, offset LEDS_ascii_table
    push ax
    mov ax, 118
    push ax
    call read_file
    add sp,6
    ;inicijalizacija tabele proizvoda
    call read_products
    call swap_pages
    ret

;*****************************************************************                                                     - 
;      procedure za stanja                                       -
;*****************************************************************
state00 proc
    ;treba da ispise vreme na displej i da predje u stanje 1 kada se ubaci novac
    push ax
    call get_time
    mov ax,offset MSG_cur_time
    push ax
    call set_current_message
    add sp,2
    mov al,PROT_current_event
    cmp al,1
    jne end11
    mov PROT_current_state,2 
end11:pop ax
    ret
endp

state01 proc
    push ax
    push bx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st01setmsg                             ;ako je brojac 0 inicijalizuj poruku
    cmp ax,2                                
    jge st01changestate                       ;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st01scrollmsg                         ;inace pomeraj poruku
st01setmsg:mov bx , offset MSG_pre_welcome    
    push bx
    call set_current_message
    add sp,2
    jmp st01end
st01scrollmsg: mov bl,50                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st01end
    call scroll_current_message
st01end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st01changestate:mov PROT_current_state,2      ;postavljanje novog stanja
    mov word ptr PROT_counter, 0
    pop bx
    pop ax
    ret
endp    
       
state02 proc
;I STANJE 3 JE POKRIVENO PROCEDUROM
   push ax
   push bx
   push dx
   push di
   mov ax,word ptr PROT_my_money
   mov bx,10
   mov dx,0
   mov di,7
   ;upisivaje ubacenih para u poruku
s02div:div bx
   add dx,30h
   mov byte ptr MSG_welcome[di],dl
   dec di
   mov dx,0
   cmp ax,0
   jne s02div
   ;postavljanje poruke      
s02clear:cmp di,1
   jle s02write
   mov byte ptr MSG_welcome[di],20h
   dec di
   jmp s02clear   
s02write:mov ax, offset MSG_welcome
   push ax
   call set_current_message
   add sp,2
   pop di
   pop dx
   pop bx
   pop ax
   ret
endp

state04 proc
    push ax
    push bx
    push cx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st04setmsg                             ;ako je brojac 0 inicijalizuj poruku
    jmp st04scrollmsg                         ;inace pomeraj poruku
st04setmsg:mov al , PROT_selected_product     ;dohvatanje indexa izabranog proizvoda
    mov ah,0
    mov bl,17                                 ;index * 17 je offset imena proizvoda
    mul bl
    mov cx, offset PROD_ime
    add ax,cx                                 ;u bx je sad adresa imena proizvoda
    push ax
    call set_current_message
    add sp,2
    jmp st04end
st04scrollmsg: mov bl,4                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st04end
    call scroll_current_message
st04end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop cx
    pop bx         
    pop ax
    ret
endp

state05 proc
    ;VRTI SE SPIRALA
    push ax
    push bx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st05setmsg                             ;ako je brojac 0 inicijalizuj poruku
    cmp ax,60                                
    jge st05changestate                       ;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st05scrollmsg                         ;inace pomeraj poruku
st05setmsg:mov bx , offset MSG_wait           ;setovanje poruke "SACEKAJTE"
    push bx
    call set_current_message
    add sp,2
    jmp st05end
st05scrollmsg: mov bl,5                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st05next
    call scroll_current_message
st05next:mov ax, word ptr PROT_counter        ;pomeranje spirale
    mov bl, 5
    div bl
    cmp ah,0
    jne st05end
    mov al, MISC_spiral_control
    cmp al,0
    je st05one
    mov al,0
    jmp st05save
st05one: mov al,1    
st05save:mov MISC_spiral_control, al
st05end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st05changestate:mov ax, PROT_my_money
    cmp ax,0
    je st05cstate
    mov PROT_current_state, 8      ;postavljanje novog stanja
    jmp end1
st05cstate:mov PROT_current_state, 10
end1:mov word ptr PROT_counter, 0
    mov byte ptr MISC_spiral_control,0
    pop bx
    pop ax
    ret
endp

state06 proc
    ;NEMA VISE TRAZENOG PROIZVODA
    push ax
    push bx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st06setmsg                             ;ako je brojac 0 inicijalizuj poruku
    cmp ax,100                                
    jge st06changestate                       ;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st06scrollmsg                         ;inace pomeraj poruku
st06setmsg:mov bx , offset MSG_no_product     ;setovanje poruke
    push bx
    call set_current_message
    add sp,2
    jmp st06end
st06scrollmsg: mov bl,5                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st06end
    call scroll_current_message
st06end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st06changestate:mov PROT_current_state,2      ;postavljanje novog stanja
    mov word ptr PROT_counter, 0
    pop bx
    pop ax
    ret
endp

state07 proc
    ;NEMA DOVOLJNO PARA
    push ax
    push bx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st07setmsg                             ;ako je brojac 0 inicijalizuj poruku
    cmp ax,100                                
    jge st07changestate                       ;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st07scrollmsg                         ;inace pomeraj poruku
st07setmsg:mov bx , offset MSG_no_money       ;setovanje poruke
    push bx
    call set_current_message
    add sp,2
    jmp st07end
st07scrollmsg: mov bl,5                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st07end
    call scroll_current_message
st07end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st07changestate:mov PROT_current_state,2      ;postavljanje novog stanja
    mov word ptr PROT_counter, 0
    
    pop bx
    pop ax
    ret
endp

state08 proc
    ;UZMI KUSUR ILI KUPUJ JOS
    push ax
    push bx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st08setmsg                             ;ako je brojac 0 inicijalizuj poruku
    cmp ax,100                                
    jge st08changestate                       ;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st08scrollmsg                         ;inace pomeraj poruku
st08setmsg:mov bx , offset MSG_take_change	       ;setovanje poruke
    push bx
    call set_current_message
    add sp,2
    jmp st08end
st08scrollmsg: mov bl,5                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st08end
    call scroll_current_message
st08end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st08changestate:mov PROT_current_state,2      ;postavljanje novog stanja
    mov word ptr PROT_counter, 0
    pop bx
    pop ax
    ret
endp


state09 proc
    ;NEMA KUSURA
    push ax
    push bx
    mov ax, word ptr PROT_counter             	;brojac vremena u ax
    cmp ax,0
    je st09setmsg                             	;ako je brojac 0 inicijalizuj poruku
    cmp ax,100                                
    jge st09changestate                       	;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st09scrollmsg                         	;inace pomeraj poruku
st09setmsg:mov bx , offset MSG_no_change     	;setovanje poruke
    push bx
    call set_current_message
    add sp,2
    jmp st09end
st09scrollmsg: mov bl,5                      	;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st09end
    call scroll_current_message
st09end:inc word ptr PROT_counter         	;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st09changestate:mov PROT_current_state,0      	;postavljanje novog stanja
    mov word ptr PROT_counter, 0
    
    pop bx
    pop ax
    ret
endp

state10 proc
    ;ZAHVALJUJEMO SE NA KORISCENJU
    push ax
    push bx
    mov ax, word ptr PROT_counter             ;brojac vremena u ax
    cmp ax,0
    je st10setmsg                             ;ako je brojac 0 inicijalizuj poruku
    cmp ax,100                                
    jge st10changestate                       ;ako je brojac 200 proslo je dovoljno vremena pa se prebaci u stanje 2
    jmp st10scrollmsg                         ;inace pomeraj poruku
st10setmsg:mov bx , offset MSG_thanks	       ;setovanje poruke
    push bx
    call set_current_message
    add sp,2
    jmp st10end
st10scrollmsg: mov bl,5                       ;pomeranje poruke (brojac broji vreme)
    div bl
    cmp ah,0
    jne st10end
    call scroll_current_message
st10end:inc word ptr PROT_counter         ;zavrsne operacije (uvecanje brojaca vremena za 1)
    pop bx         
    pop ax
    ret
st10changestate:mov PROT_current_state,0      ;postavljanje novog stanja
    mov word ptr PROT_counter, 0
    mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh
    mov PROT_counter,0
    pop bx
    pop ax
    ret
endp

;*****************************************************************
;-  timer_interrupt                                             - 
;-      glavni prekid za timer                                  -
;-                                                              -
;-  parametri:                                                  -
;       -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************

timer_interrupt proc near
    push ax
    mov al, PROT_current_state
    cmp al,0
    je s0
    cmp al,1
    je s1
    cmp al,2
    je s2
    cmp al,3
    je s2
    cmp al,4
    je s4
    cmp al,5
    je s5
    cmp al,6
    je s6
    cmp al,7
    je s7
    cmp al,8
    je s8
    cmp al,9
    je s9
    cmp al,10
    je s10
    jmp end12
    s0:
    call state00
    jmp end12
    s1:
    call state01
    jmp end12
    s2:
    call state02
    jmp end12
    s4:
    call state04
    jmp end12
    s5:
    call state05
    jmp end12
    s6:
    call state06
    jmp end12
    s7:
    call state07
    jmp end12
    s8:
    call state08
    jmp end12
    s9:
    call state09 
    s10:
    call state10   
    end12:pop ax
    ret                           
;*****************************************************************
;-  /timer_interrupt                                            -
;*****************************************************************


;*****************************************************************
;-  keyboard_handler                                            - 
;-     zove se da proveri da li je pritisnuto nesto na tastaturi-
;-                                                              -
;-  parametri:                                                  -
;       -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************

keyboard_handler proc
    push ax
    push bx
    push cx
    push dx
    mov ah,01h      ;da li ima karaktera u baferu
    int 16h
    jnz  key_fwd0
    jmp keyboard_end
key_fwd0:mov ah, 00h       ;ako ima procitaj ga
    int 16h
    mov cl, PROT_current_state
    ;stanje je u cl
    ;karakter je u al, proverava se koji je i utice se na stanja masine u skladu sa tim
    cmp al, 1Bh          ;provera za 'esc'
    jne key_fwd13
    jmp key_esc
key_fwd13:cmp al,73h     ;provera za 's'(10 din)
    jne key_fwd1
    mov MOD_I,1
    jmp key_s
key_fwd1:cmp al,64h      ;provera za 'd'(20 din)
    jne key_fwd2
    mov MOD_I,1
    jmp key_d
key_fwd2:cmp al,66h      ;provera za 'f'(50 din)
    jne key_fwd3
    mov MOD_I,1
    jmp key_f
key_fwd3:cmp al,67h      ;provera za 'g'(100 din)
    jne key_fwd4
    mov MOD_I,1
    jmp key_g
key_fwd4:cmp al,68h      ;provera za 'h'(200 din)
    jne key_fwd5
    mov MOD_I,1
    jmp key_h
key_fwd5:cmp al,61h      ;provera za 'a'(accept)
    jne key_fwd6
    jmp key_a
key_fwd6:cmp al,72h      ;provera za 'r'(reject)
    jne key_fwd20
    jmp key_r
key_fwd20:cmp al,74h      ;provera za 't'(disconnect)
    jne key_fwd21
    mov MOD_I,1
    jmp key_t
key_fwd21:cmp al,75h      ;provera za 'u'(conect)
    jne key_fwd7
    mov MOD_I,1
    jmp key_u
key_fwd7:cmp al,63h      ;provera za 'c'(change)
    jne key_fwd8
    jmp key_c
key_fwd8:cmp al,30h      ;provera za '0':'9'(0-9 na tastaturi)
    jge key_fwd9
    jmp keyboard_end
key_fwd9:cmp al,39h
    jle  key_fwd10
    jmp  keyboard_end
    ;pritisnuto 0-9
key_fwd10:cmp cl, 2
    jne k_n_s_3
    mov bx, offset MSG_welcome  
    mov [bx],al
    mov ah,0                       
    sub al,30h                     ;izracunavanje cifre desetice
    mov bl,10
    mul bl
    mov PROT_selected_product,al   ;cuvanje sifre u promenmljivoj
    mov PROT_counter,0
    mov PROT_current_state,3
    jmp keyboard_end
k_n_s_3:cmp cl,3
    je  key_fwd11
    jmp keyboard_end
key_fwd11:mov PROT_counter,0
    mov bx, offset MSG_welcome
    mov [bx]+1,al
    mov ah, 0
    sub al, 30h                    ;izracunavanje cifre jedinice
    mov bl, PROT_selected_product  ;dohvatanje prethodno izracunatih desetica
    add bl, al                     ;izracunavanje sifre
    mov bh, 0
    mov al, PROD_kol[bx]           ;provera da li ima proizvoda pod zadatom sifrom
    cmp al, 0
    je k_no_product
    mov al, PROD_cen[bx]           ;provera da li je ubaceno dovoljno para
    mov ah, 0
    mov dx, word ptr PROT_my_money
    cmp dx,ax
    jl k_no_money
    mov PROT_selected_product, bl 
    mov PROT_current_state,4
    jmp keyboard_end
k_no_product:
    mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh 
    mov PROT_current_state,6
    jmp keyboard_end
k_no_money:
    mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh 
    mov PROT_current_state,7
    jmp keyboard_end     
    
    ;pritisnuto 'c'
key_c:cmp cl,2
    je k_c
    cmp cl,3
    je k_c
    cmp cl,4
    je k_c
    jmp keyboard_end
k_c:mov bl,PROT_product_taken
    cmp bl,0
    jne k_c1
    jmp keyboard_end 
k_c1:mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh
    mov PROT_counter,0
    mov ax, word ptr PROT_my_money
c200:cmp ax, 200
    jl c100
    cmp word ptr PROT_200,0
    je c100
    sub ax,200
    sub PROT_200,1
    mov word ptr PROT_my_money, ax
    jmp c200
c100:cmp ax, 100
    jl c50
    cmp word ptr PROT_100,0
    je c50
    sub ax,100
    dec PROT_100
    mov word ptr PROT_my_money, ax
    jmp c100
c50:cmp ax, 50
    jl c20
    cmp word ptr PROT_50,0
    je c20
    sub ax,50
    dec PROT_50
    mov word ptr PROT_my_money, ax
    jmp c50
c20:cmp ax, 20
    jl c10
    cmp word ptr PROT_20,0
    je c10
    sub ax,20
    dec PROT_20
    mov word ptr PROT_my_money, ax
    jmp c20
c10:cmp ax, 10
    jl c0
    cmp word ptr PROT_10,0
    je c0
    sub ax,10
    dec PROT_10
    mov word ptr PROT_my_money, ax
    jmp c10
c0: cmp ax,0
    jne  ncange
    jmp cange
ncange:mov PROT_current_state,9
    mov PROT_product_taken, 0
    mov PROT_counter,0
    jmp keyboard_end
cange:mov PROT_current_state,10
    mov PROT_product_taken, 0
    mov PROT_counter,0
    jmp keyboard_end
    
    ;pritisnuto 'r'
key_r:
    cmp cl,2
    je k_r
    cmp cl,3
    je k_r
    cmp cl,4
    je k_r
    jmp keyboard_end
k_r:mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh
    mov PROT_counter,0
    mov PROT_current_state,2     
    jmp keyboard_end
    
    ;pritisnuto 'a'
key_a:cmp cl,4
    je  key_fwd12
    cmp cl, 2
    je  key_fwd12
    jmp keyboard_end
key_fwd12:mov bl,PROT_selected_product
    mov bh,0
    mov al, PROD_kol[bx]           ;provera da li ima proizvoda pod zadatom sifrom
    cmp al, 0
    je k_no_product1
    mov al, PROD_cen[bx]           ;provera da li je ubaceno dovoljno para
    mov ah, 0
    mov dx, word ptr PROT_my_money
    cmp dx,ax
    jl k_no_money1
    jmp money_dec
    jmp keyboard_end
k_no_product1:
    mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh 
    mov PROT_current_state,6
    jmp keyboard_end
k_no_money1:
    mov byte ptr MSG_welcome, 2Dh       ;ponistavanje unosa
    mov byte ptr MSG_welcome+1, 2Dh
    mov PROT_selected_product, 0FFh 
    mov PROT_current_state,7
    jmp keyboard_end 
money_dec:				;umanjenje sume i kolicine proizvoda
    dec PROD_kol[bx]
    mov ax, word ptr PROT_my_money
    mov dl, PROD_cen[bx]
    mov dh,0
    sub ax,dx
    mov word ptr PROT_my_money,ax
    mov ax, PROD_sum_money
    add ax, dx
    mov PROD_sum_money, ax
    mov al, PROD_money[bx]
    add al, dl
    mov PROD_money[bx], al
    mov PROT_product_taken, 1
    mov PROT_counter,0
    mov PROT_current_state,5
    jmp keyboard_end   
    
    ;pritisnuto 'h'
key_h:cmp cl,0
    je k_h_0
    cmp cl, 2
    je k_h
    cmp cl, 3
    je k_h
    cmp cl, 4
    je k_h
    jmp keyboard_end
k_h_0:mov PROT_counter,0
    mov PROT_current_state,1
k_h:add word ptr PROT_my_money, 200
    inc PROT_200
    jmp keyboard_end
    
    ;pritisnuto 'g'
key_g:cmp cl,0
    je k_g_0
    cmp cl, 2
    je k_g
    cmp cl, 3
    je k_g
    cmp cl, 4
    je k_g
    jmp keyboard_end
k_g_0:mov PROT_counter,0
    mov PROT_current_state,1
k_g:add word ptr PROT_my_money, 100
    inc PROT_100 
    jmp keyboard_end
    
    ;pritisnuto 'f'
key_f:cmp cl,0
    je k_f_0
    cmp cl, 2
    je k_f
    cmp cl, 3
    je k_f
    cmp cl, 4
    je k_f
    jmp keyboard_end
k_f_0:mov PROT_counter,0
    mov PROT_current_state,1
k_f:add word ptr PROT_my_money, 50
    inc PROT_50 
    jmp keyboard_end
    
    ;pritisnuto 'd'
key_d:cmp cl,0
    je k_d_0
    cmp cl, 2
    je k_d
    cmp cl, 3
    je k_d
    cmp cl, 4
    je k_d
    jmp keyboard_end
k_d_0:mov PROT_counter,0
    mov PROT_current_state,1
k_d:add word ptr PROT_my_money, 20
    inc PROT_20 
    jmp keyboard_end

    ;pritisnuto 's'
key_s:cmp cl,0
    je k_s_0
    cmp cl, 2
    je k_s
    cmp cl, 3
    je k_s
    cmp cl, 4
    je k_s
    jmp keyboard_end
k_s_0:mov PROT_counter,0
    mov PROT_current_state,1
k_s:add word ptr PROT_my_money, 10
    inc PROT_10 
    jmp keyboard_end

key_t:
    mov PROT_connected, 0
    jmp keyboard_end

key_u:cmp cl,4
    jne keyboard_end
    mov PROT_connected, 1
    jmp keyboard_end

    ;pritisnuto 'esc'
key_esc:mov MISC_the_end,1                
keyboard_end:pop dx
    pop cx
    pop bx
    pop ax
    ret

;*****************************************************************
;-  /keyboard_handler                                           -
;*****************************************************************



;*****************************************************************
;-  write_compnents                                             -
;-      crta sve komponente sistema                             -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
write_components proc
    push ax
    push bx
    mov ax, 0A0Dh
    push ax
    call draw_LED_display
    add sp,2
    
    mov ax, 0FF0h
    push ax
    call write_legend
    add sp,2
    
    mov ax, 0F1Ah
    push ax
    call write_spiral
    add sp,2


    mov al, PROT_connected
    cmp al, 0
    je skip

    mov ax,11DBh
    push ax
    call write_signals
    pop ax
 
skip:call swap_pages    
    pop bx
    pop ax
    ret


;*****************************************************************
;-  write_legend                                                -
;-      ispisuje legendu komandi za automat                     -
;-                                                              -
;-  parametri:                                                  -
;       -koordinate: 16bit(visi bajt red, nizi bajt kolona)     -                                           -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
write_legend proc
    push bp
    mov bp, sp
    push ax
    push bx
    push cx
    
    mov ax, 4[bp]
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg0
    push bx
    call write_string
    pop bx 
    
    inc ah
    push ax
    call gotoxy
    pop ax 
    
    mov bx, offset MSG_leg1
    push bx
    call write_string
    pop bx 
    
    inc ah
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg2
    push bx
    call write_string
    pop bx 
     
     
    inc ah
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg3
    push bx
    call write_string
    pop bx
                             
    
    
    inc ah
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg6
    push bx
    call write_string
    pop bx 
    
    
    inc ah
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg7
    push bx
    call write_string
    pop bx  
    
    
    inc ah
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg8
    push bx
    call write_string
    pop bx 

    mov ah,0
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg9
    push bx
    call write_string
    pop bx

    inc ah
    push ax
    call gotoxy
    pop ax
    
    mov bx, offset MSG_leg8
    push bx
    call write_string
    pop bx 
          
             
    pop cx
    pop bx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /write_legend                                               -
;*****************************************************************  

;*****************************************************************
;-  write_spiral                                                -
;-      simulira kretanje spirale sa proizvodima                -
;-                                                              -
;-  parametri:                                                  -
;       -koordinate: 16bit(visi bajt red, nizi bajt kolona)     -                                          
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
write_spiral proc
    push bp
    mov bp, sp
    push ax
    push bx
    push cx 
    push dx
    
    mov ax, 4[bp]      ;pozicija u ax
    
    push ax
    call gotoxy
    add sp,2
    
    mov al, byte ptr MISC_spiral_control
    cmp al,0
    je zero_spiral
    
    mov ax, offset MSG_spiral_turning1
    push ax
    call write_string
    add sp,2 
    jmp spiral_end
zero_spiral:mov ax, offset MSG_spiral_turning2
    push ax
    call write_string
    add sp,2           
    
spiral_end: pop dx         
    pop cx
    pop bx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /write_spiral                                               -
;***************************************************************** 


;----------------------------------------------------------------
;-  write_signals                                               -
;-      simulira kontrolne linije                               -
;-                                                              -
;-  parametri:                                                  -
;       -koordinate: 16bit(visi bajt red, nizi bajt kolona)     -                                                 -
;       -broj signala i aktivnost: 16bit(visi bajt signal,      -
;-                                        nizi aktivnost)       -                                                                      
;-  vraca:                                                      -
;-      -nista                                                  -
;----------------------------------------------------------------
write_signals proc
    push bp
    mov bp, sp
    push ax
    push bx
    push cx
    push si
    push di
    
    mov ax, 4[bp]      ;pozicija u ax  
    inc ah
    push ax
    call gotoxy  
    pop ax
    mov si, 18
    push ax
    mov bx, offset MSG_info1
    mov ax, PROD_sum_money 
    mov cx, 10
deli1:mov dx,0
    div cx
    add dl, 30h
    mov [bx+si], dl
    dec si
    cmp ax, 0
    jnz deli1
    push bx
    call write_string
    pop bx
    pop ax

    inc ah
    push ax
    call gotoxy  
    pop ax
    
    mov si, 18
    push ax
    mov bl, PROT_selected_product
    mov bh, 0
    cmp bl, 0FFh
    je popuni
    mov al, PROD_money[bx]
    mov ah, 0
    mov bx, offset MSG_info2 
    mov cx, 10
deli2:mov dx,0
    div cx
    add dl, 30h
    mov [bx+si], dl
    dec si
    cmp ax, 0
    jnz deli2
    jmp print
popuni:mov bx, offset MSG_info2
    mov dl, ' '
    mov ax, 5
pop3:mov [bx+si], dl
    dec si
    dec ax
    cmp ax, 0
    jnz pop3 
print: push bx
    call write_string
    pop bx
    pop ax

    pop di
    pop si
    pop cx
    pop bx
    pop ax
    pop bp
    ret
;----------------------------------------------------------------
;-  /write_signals                                              -
;----------------------------------------------------------------



;*****************************************************************
;-  gotoxy                                                      -
;-      postavljanje kursora na koordinate x,y                  -
;-                                                              -
;-  parametri:                                                  -
;-      -koordinate: 16bit(visi bajt red, nizi bajt kolona)     -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
gotoxy proc near
push bp
mov bp,sp
push cx
push ax
push bx
mov bx, 4[bp]                   ;koordinate u bx
mov al, bh                      ;broj reda u al
mov cl, 160                     
mul cl                          ;broj reda se mnozi sa 160
mov bh, 0
shl bx, 1                       
add ax, bx                      ;i dodaje mu se broj kolone pomnozen sa 2
mov word ptr DISP_cur_pos, ax   ;pozicija se upisuje u promenljivu
pop bx
pop ax
pop cx
pop bp
ret
;*****************************************************************
;-  /gotoxy                                                     -
;*****************************************************************

;*****************************************************************
;-  get_cursor                                                  -
;-      ocitava podatke o poziciji kursora                      -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;       -pozicija: 16bit(visi bajt red nizi bajt kolona)        -
;*****************************************************************
get_cursor proc near
push bp
mov bp, sp 
push ax 
push bx
mov ax, DISP_cur_pos  ; index u ax
mov bl, 160           
div bl                ; index se deli sa 160, u al je sada broj reda
mov bh, al            ; broj reda u bh
shr ah, 1             ; u ah je broj kolone pomnozen sa dva pa se zato deli sa 2
mov bl, ah            ; broj kolone u bl
mov word ptr 4[bp],bx ; informacija se sada stavlja na stek
pop bx
pop ax
pop bp
ret
;*****************************************************************
;-  /get_cursor                                                 -
;***************************************************************** 


;*****************************************************************
;-  get_attribute                                               -
;-      ocitava podatke o atributima na mestu kursora           -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -podatak: 16b visi bajt atribut, nizi bajt karakter     -
;*****************************************************************
get_attribute proc near
push bp
mov bp, sp 
push ax
push bx
mov bx , word ptr DISP_cur_pos
mov ax, word ptr DISP_buffer[bx]
mov word ptr 4[bp], ax
pop bx
pop ax
pop bp
ret
;*****************************************************************
;-  /get_attribute                                              -  
;*****************************************************************
                                                                     
;*****************************************************************
;-  set_attribute                                               -
;-      postvlja trenutni atribub teksta                        -
;-                                                              -
;-  parametri:                                                  -
;-      -atribut: 8 bit                                        -
;-  vraca:                                                      -
;-      -nist                                                   -
;*****************************************************************
set_attribute proc near
push bp
mov bp, sp 
push ax
mov ax, word ptr 4[bp]
mov byte ptr DISP_cur_attr, al
pop ax
pop bp
ret
;*****************************************************************
;-  /set_attribute                                              -  
;*****************************************************************                                                                     
                                                                     
                                                                     
;*****************************************************************
;-  write_character                                             -
;-      ispisuje karakter na mestu kursora                      -
;-                                                              -
;-  parametri:                                                  -
;-      -karakter za ispis :8bit                                -
;-      -koliko ce se puta ispisati                             -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
write_character proc near
push bp
mov bp, sp 
push ax
push bx
push cx
mov cx,4[bp]                             ;broj ispisa u cx
mov ax,6[bp]                             ;karakter u ax
mov ah, byte ptr DISP_cur_attr           ;trenutni atribut u ah
mov bx, word ptr DISP_cur_pos            ;pozicija u bx
loop3: mov word ptr DISP_buffer[bx], ax  ;upisivanje karaktera
add bx,2
loop loop3
pop cx
pop bx
pop ax
pop bp
ret
;*****************************************************************
;-  /write_character                                            -
;*****************************************************************                                                                    

;*****************************************************************
;-  write_character_att                                             -
;-      ispisuje karakter na mestu kursora                      -
;-                                                              -
;-  parametri:                                                  -
;-      -karakter za ispis :8bit                                -
;       -atribut za ispis  :8bit                                -
;       -koliko ce se puta ispisati                             -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
write_character_att proc near
push bp
mov bp, sp 
push ax
push cx  
mov cx,4[bp]
mov ax,6[bp]
push ax
call set_attribute
add sp,2
mov ax, 8[bp]
push ax
push cx
call write_character
add sp,4
pop cx         
pop ax
pop bp
ret
;*****************************************************************
;-  /write_character_att                                            -
;***************************************************************** 

;*****************************************************************
;-  swap_pages                                                  -
;-      menja trenutno vidljivu stranicu                        -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
swap_pages proc
    push ax
    push bx
    push cx
    push es
    push bp
    
    mov ax, ds
    mov es, ax            ; es se koristi pri ispisu
    mov ah, 2
    mov dx, 0000h
    mov bh, byte ptr DISP_page_r
    int 10h		          ;pozicioniranje na koordinate 0,0
    mov ax, 1302h         ; postavljanje moda
    mov bh, DISP_page_r   ; stranica na koju se crta
    mov cx, 2000          ; broj karaktera u cx
    mov bp, offset DISP_buffer ; bp pokazuje na bafer
    int 10h
   mov al, DISP_page_v
   mov bl, DISP_page_r
   mov DISP_page_v, bl
   mov DISP_page_r, al
   mov ah, 05h
   mov al, bl
   int 10h
    
    pop bp
    pop es
    pop cx
    pop bx
    pop ax
    ret
;*****************************************************************
;-  /swap_pages                                                 -
;*****************************************************************


;*****************************************************************
;-  write_string                                                -
;-      ispisivanje stringa                                     -
;-                                                              -
;-  parametri:                                                  -
;-      -pokazivac na string: 16bit(offset deo, segment je ds)  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
write_string proc near
    push bp
    mov bp,sp
    push ax
    push cx
    push bx
    push si
    push di
    
    mov bx, 4[bp]
    mov di, word ptr DISP_cur_pos            ;pozicija u bx
    mov si,0
    mov ah, byte ptr DISP_cur_attr           ;trenutni atribut u ah
    
wstr:mov al, bx[si]                           ;karakter u al
    cmp al,0
    je end10
    mov word ptr DISP_buffer[di], ax         ;upisivanje karaktera
    add di,2
    add si,1 
    jmp wstr    
end10:pop di
    pop si 
    pop bx
    pop cx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /write_string                                               -
;*****************************************************************

;*****************************************************************
;-  read_file                                                   -
;-      cita fajl sa zadatim imenom i smeta bajtove u memoriju  -
;-                                                              -
;-  parametri:                                                  -
;-      -ime: 16 bit, pokazivac na string sa imenom u ds        -
;-      -odrediste:16 bit, pokazivac na bafer u ds              -
;-      -broj bajtova: 16 bit, broj bajtova koje treba procitati-
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
read_file proc
    push bp
    mov bp, sp
    push ax
    push bx
    push cx
    push dx
    mov dx, word ptr 8[bp]  ;ime fajla u dx
    mov ax, 3D00h           ;setovanje moda za otvaranje fajla
    int 21h                 ;otvaranje fajla
    jc error                ;ako greska idi na error
    mov bx,ax               ;handle u bx
    mov cx, word ptr 4[bp]  ;broj bajtova u cx
    mov dx,word ptr 6[bp]   ;odrediste u dx
    mov ah,3Fh              ;mod za citanje
    int 21h                 ;citanje bajtova iz fajla
    jc error                ;ako greska idi na error
    mov ah,3Eh              ;mod za zatvaranje fajla
    int 21h                 ;zatvaranje fajla
    jc error                ;ako greska idi na error
    jmp end3
 error:mov ax,0
    push 1225h
    call gotoxy
    add sp,2
    push 0021h
    push 0005h
    call write_character
    add sp,4
 end3:pop dx
    pop cx
    pop bx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /read_file                                                  -
;*****************************************************************

;*****************************************************************
;-  char2LED                                                    -
;-      pretvara karakter iz al u njegovu LED reprezentaciju,   -
;-      rezultat smesta u ax                                    -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************

char2LED proc
    push bx
    cmp al, 20h
    jl unsupported    
    cmp al, 5Ah
    jg unsupported
    sub al,20h
    jmp end4
unsupported: mov al,0    
end4:mov ah, 0h
    mov bl, 2
    mul bl
    mov bx,ax
    mov ax, word ptr LEDS_ascii_table[bx]
    pop bx
    ret
;*****************************************************************
;-  /char2LED                                                   -
;*****************************************************************

;*****************************************************************
;-  draw_LED_unit                                               -
;-      crta LED jedinicu na zadatim koordinatama               -
;-                                                              -
;-  parametri:                                                  -
;-      -koordinate:16bit(visi bajt red, nizi bajt kolona)      -
;-      -redni broj:8bit (0..7)                                 -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************

draw_LED_unit proc
    push bp
    mov bp,sp
    push ax
    push bx
    push cx
    push dx
    push di
    mov di, 4[bp]           ;index elementa u nizu LEDS_buffer
    mov ax, 6[bp]           ;koordinate u ax(koristice se samo al - kolona)    
    mov bl, ah              ;red u bl (sada su koordinate bl-red, al kolona)
    mov cx, LEDS_buffer[di] ;stanje jedinice u cx
    add al,1
    push ax
    call gotoxy
    add sp,2
    sub al,1
    test cx, 0080h
    jz ugasena1   
    push 2Dh
    push 1
    call write_character
    add sp,4    
    jmp druga
ugasena1:push 20h
    push 1
    call write_character
    add sp,4   
    ;2 vodoravna
druga:add al,3
    push ax
    call gotoxy
    add sp, 2
    sub al,3
    test cx, 0040h
    jz ugasena2
    push 2Dh
    push 1
    call write_character
    add sp,4    
    jmp treca
ugasena2:push 20h
    push 1
    call write_character
    add sp,4        
    ;drugi red
treca:add bl,1
      mov ah,bl
    ;1 vertikalna
     push ax
     call gotoxy
     add sp, 2
     test cx, 0020h
     jz ugasena3
     push 07Ch
     push 1
     call write_character
     add sp,4
     jmp cetvrta
ugasena3:push 20h
     push 1
     call write_character
     add sp,4        
    ;2 kosa nalevo
cetvrta:add al,1
    push ax
    call gotoxy
    add sp, 2
    sub al,1
    test cx, 0010h
    jz ugasena4
    push 5Ch
    push 1
    call write_character
    add sp,4
    jmp peta
ugasena4:push 20h
     push 1
     call write_character
     add sp,4        
    ;3 vertikalna
peta:add al,2
    push ax
    call gotoxy
    add sp,2
    sub al,2
    test cx, 0008h
    jz ugasena5
    push 07Ch
    push 1
    call write_character
    add sp,4
    jmp sesta
ugasena5:push 20h
    push 1
    call write_character
    add sp,4
    ;4 kosa nadesno
sesta:add al,3
    push ax
    call gotoxy
    add sp,2
    sub al,3
    test cx, 0004h
    jz ugasena6
    push 2Fh
    push 1
    call write_character
    add sp,4
    jmp sedma
ugasena6:push 20h
    push 1
    call write_character
    add sp,4    
    ;5 vertikalna
sedma:add al,4
    push ax
    call gotoxy
    add sp,2
    sub al,4
    test cx, 0002h
    jz ugasena7
    push 07Ch
    push 1
    call write_character
    add sp,4
    jmp osma
ugasena7:push 20h
    push 1
    call write_character
    add sp,4   
    ;treci red
osma:add bl,1
    mov ah,bl
    ;1 vodoravna
    add al,1
    push ax
    call gotoxy
    add sp,2
    sub al,1 
    test cx, 0001h
    jz ugasena8
    push 2Dh
    push 1
    call write_character
    add sp,4
    jmp deveta
ugasena8:push 20h
    push 1
    call write_character
    add sp,4   
    ;2 vodoravna
deveta:add al,3
    push ax
    call gotoxy
    add sp,2
    sub al,3
    test cx, 8000h
    jz ugasena9
    push 2Dh
    push 1
    call write_character
    add sp,4
    jmp deseta
    ugasena9:push 20h
    push 1
    call write_character
    add sp,4        
    ;cetvrti red
deseta:add bl,1
    mov ah,bl    
    ;1 vertikalna
    push ax
    call gotoxy
    add sp,2
    test cx, 4000h
    jz ugasena10
    push 07Ch
    push 1
    call write_character
    add sp,4
    jmp jedanaesta
ugasena10:push 20h
    push 1
    call write_character
    add sp,4   
    ;2 kosa nadesno
jedanaesta:add al,1
    push ax
    call gotoxy
    add sp,2
    sub al,1
    test cx, 2000h
    jz ugasena11
    push 2Fh
    push 1
    call write_character
    add sp,4
    jmp dvanaesta
ugasena11:push 20h
    push 1
    call write_character
    add sp,4   
    ;3 vertikalna
dvanaesta:add al,2
    push ax
    call gotoxy
    add sp,2
    sub al,2
    test cx, 1000h
    jz ugasena12
    push 07Ch
    push 1
    call write_character
    add sp,4
    jmp trinaesta
ugasena12:push 20h
    push 1
    call write_character
    add sp,4        
    ;4 kosa nalevo
trinaesta:add al,3
    push ax
    call gotoxy
    add sp,2
    sub al,3 
    test cx, 0800h
    jz ugasena13
    push 5Ch
    push 1
    call write_character
    add sp,4
    jmp cetrnaesta
ugasena13:push 20h
    push 1
    call write_character
    add sp,4       
    ;5 vertikalna
cetrnaesta:add al,4
    push ax
    call gotoxy
    add sp,2
    sub al,4 
    test cx, 0400h
    jz ugasena14
    push 07Ch
    push 1
    call write_character
    add sp,4
    jmp petnaesta
ugasena14:push 20h
    push 1
    call write_character
    add sp,4           
    ;peti red
petnaesta:add bl,1
    mov ah,bl
    ;1 vodoravna
    add al,1
    push ax
    call gotoxy
    add sp,2
    sub al,1
    test cx, 0200h
    jz ugasena15
    push 2Dh
    push 1
    call write_character
    add sp,4
    jmp sesnaesta
ugasena15:push 20h
    push 1
    call write_character
    add sp,4       
    ;2 vodoravna
sesnaesta:add al,3
    push ax
    call gotoxy
    add sp,2
    sub al,3
    test cx, 0100h
    jz ugasena16     
    push 2Dh
    push 1
    call write_character
    add sp,4
    jmp kraj
ugasena16:push 20h
    push 1
    call write_character
    add sp,4    
kraj:pop di
    pop dx
    pop cx
    pop bx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /draw_LED_unit                                              -
;*****************************************************************

;*****************************************************************
;-  draw_LED_display                                            -
;-      crta LED dislplej od 8 elemenata                        -
;-                                                              -
;-  parametri:                                                  -
;-      -koordinate: 16bit(visi bajt red nizi bajt kolona)      -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************

draw_LED_DISPLAY proc
    push bp
    mov bp,sp
    push ax
    push bx
    push cx
    mov ax,4[bp]            ; koordinate u al
    cmp al, 32              
    jg kraj1                ; ako displej ne moze da stane , ne crtati ga
    mov bx,0                ; offset unutar LEDS_buffer 
    mov cx,8                ; 8 jedinica LED_unit
loop1:push ax               ; koordonate na stek
    push bx                 ; offset na stek
    call draw_LED_unit
    add sp,4
    add ax,6                ; 6 polja u desno se crta sledeca jedinica
    add bx,2
    loop loop1  
kraj1:pop cx
    pop bx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /draw_LED_display                                           -
;*****************************************************************

;*****************************************************************
;-  set_LED_states                                              -
;-      postavlja vrednosti u LEDS_buffer vektor - LEDS_cur_msg -
;-sadrzi pokazivac na poruku a LEDS_cur_msg_offset oznaceni     -
;-pomeraj u odnosu na pocetak poruke do karaktera koji treba da -
;-se prikaze u krajnjoj levoj jedinici                          -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
set_LED_states proc
    push ax
    push bx
    push cx
    push di
    push si 
    mov bx, word ptr LEDS_cur_msg           ;pokazivac na poruku u bx
    mov al, byte ptr LEDS_cur_msg_offset    ;oznaceni pomeraj u al
    cbw                                     ;prosiri pomeraj znakom
    mov si, ax                              ;pomeraj u si
    mov ax, 0                               ;ax ce da sadrzi stanje jedinice koje treba upisati
    mov di, 0                               ;di je pomeraj unutar LEDS_buffer
    mov cx, 0                               ;cx je indikator kraja poruke
neg_offset: cmp si,0
    jge pos_offset                          ;ako je pomeraj pozitivan idi na pos_offset
    mov word ptr LEDS_buffer[di], ax        ;ako je negativan upisi u jedinicu prazno
    add di, 2                               ;di pokazije na sledecu jedinicu
    inc si                                  ;povecaj pomeraj za 1
    cmp di, 10h
    jge end6                                ;ako je upisano 8 jedinica idi na kraj
    jmp neg_offset                          ;dok je pomeraj negativan...
pos_offset: cmp di, 10h
    jge end6                                ;ako je upisano 8 jedinica idi na kraj
    cmp cx, 1                                     
    je eof_msg                              ;ako je doslo do kraja poruke upisuj prazno
    mov al,byte ptr bx[si]                  ;karakter iz poruke u al
    cmp al, 0
    jne c2l                                 ;ako al nije 0 idi na c2l
    mov cx,1                                ;ako je al 0, doslo se do kraja poruke pa se postavlja indikator
c2l:call char2LED                           ;pretvori karakter u stanje jedinice
    jmp set_led                             
eof_msg: mov ax, 0                          ;ako nema vise poruke upisuj prazno
set_led:mov word ptr ds:LEDS_buffer[di], ax ;upisi karakter u jedinicu
    add di,2                                ;di pokazije na sledecu jedinicu
    inc si                                  ;povecaj pomeraj za 1
    jmp pos_offset                          ;dok se ne upise 8 jedinica...
    end6:pop si
    pop di
    pop cx           
    pop bx
    pop ax
    ret
;*****************************************************************
;-  /set_LED_states                                             -
;*****************************************************************

;*****************************************************************
;-  set_current_message                                         -
;-      postavlja novu poruku za prikaz na displej              -
;-                                                              -
;-  parametri:                                                  -
;-      -poruka:16 bit pokazivac na poruku u ds                 -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************

set_current_message proc
    push bp    
    mov bp,sp
    push ax
    push bx
    push di
    mov bx, word ptr 4[bp]                             ;pokazivac na poruku u bx
    mov di,0                                           ;brojac di
    mov word ptr LEDS_cur_msg, bx                      ;setovanje poruke
    count:mov al, ds:bx[di]                            ;brojanje karaktera u poruci
    cmp al,0
    je comp8
    inc di                                             
    jmp count
    comp8: cmp di,8                                    ;u di je broj karaktera u poruci
    jg greater                                         ;ako je poruka duza od 8 karaktera idi na greater
    mov ax,8                                           ;sada se racuna pozicija za centriranje poruke na displeju
    sub ax,di
    mov bl,2
    div bl
    neg al
    mov byte ptr LEDS_cur_msg_offset, al               ;konacno se pomeraj postavlja na izracunatu vrednost
    mov byte ptr LEDS_scroll_msg, 0h                   ;poruka je manja od 8 karaktera pa je ne treba pomerati
    jmp end7
    greater: mov byte ptr LEDS_cur_msg_offset, -7      ;poruka je veca od 8 karaktera pa prikaz pocinje samo sa prvim slovom
    mov byte ptr LEDS_scroll_msg, 1h                   ;poruku treba pomerati
    end7:call set_LED_states
    pop di
    pop bx
    pop ax
    pop bp
    ret
;*****************************************************************
;-  /set_current_message                                        -
;*****************************************************************
;*****************************************************************
;-  scroll_current_message                                      -
;-     pomera poruku po displeju ako je LEDS_scroll_msg=1 inace -
;-      ne radi nista                                           -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
scroll_current_message proc
    push ax
    mov ax,0
    mov al, byte ptr LEDS_scroll_msg                 ;indikator u al
    cmp al,1
    jne end8                                         ;ako je indikator 0 ne radi nista
    mov al, byte ptr LEDS_cur_msg_offset             ;prvo, trenutni pomeraj u al
    cmp al,0                                         
    jge check_end                                    ;ako je pomeraj veci od 0 idi na check_end
    inc al                                           ;uvecaj pomeraj za 1
    mov byte ptr LEDS_cur_msg_offset, al             ;vrati pomeraj u promenljivu
    jmp end8                                         ;idi na kraj
check_end:mov si,ax                                  ;pomeraj u si
    mov bx, LEDS_cur_msg                             ;pokazivac na poruku u bx 
    mov bl, byte ptr bx[si]                          ;karakter u poruci u al
    cmp bl,0
    je reset_scroll                                  ;ako je karakter 0, idi na reset scroll
    inc al                                           ;ako krarakter nije 0, uvecaj pomeraj za 1
    mov byte ptr LEDS_cur_msg_offset, al             ;vrati pomeraj u promenljivu
    jmp end8                                         ;idi na kraj
reset_scroll:mov byte ptr LEDS_cur_msg_offset, -7    ;ako je karakter 0, vrati pomeraj na -7   
end8:call set_LED_states
    pop ax
    ret
;*****************************************************************
;-  /scroll_current_message                                     -
;*****************************************************************


;*****************************************************************
;-  module_control                                              -
;-      kontrolise ponasanje modula sa novcem                   -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************


module_control proc
    push ax
    push bx
    cmp PROT_current_state,8
    je mc_end
    cmp byte ptr MISC_module_control,0
    jle mc_start_cycle
    inc byte ptr MISC_module_control
    cmp byte ptr MISC_module_control,4
    jle mc_end
    mov byte ptr MOD_I,0
    mov byte ptr MOD_R,1
    cmp byte ptr MISC_module_control,8
    jle mc_end
    mov byte ptr MOD_R,0
    mov byte ptr MISC_module_control,0
    jmp mc_end    
mc_start_cycle:cmp MOD_I,0
    je mc_end
    mov byte ptr MISC_module_control,1   
mc_end:pop bx
    pop ax
    ret 

;*****************************************************************
;-  get_time                                                    -
;-      ocitava podatke o trenutnom vremenu                     -
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
get_time proc near
push bp
mov bp, sp 
push ax 
push bx
push cx 
push dx  

mov ah, 2ch
int 21h   

mov sec,dh 

mov al, ch  ;hour
mov ah, 0
mov bl, 64h
div bl      ;divide ax by 64h
mov al, ah  ;move the remainder to al
mov ah, 0h 
mov bl, 0ah
div bl      ;divide ax by bl
mov dh, al
mov dl, ah

add dx, 3030h
mov MSG_cur_time, dh
mov MSG_cur_time+1, dl

mov al, cl  ;minute
mov ah, 0
mov bl, 64h
div bl      ;divide ax by 64h
mov al, ah  ;move the remainder to al
mov ah, 0h 
mov bl, 0ah
div bl      ;divide ax by bl
mov ch, al
mov cl, ah

add cx, 3030h
mov MSG_cur_time+3,ch
mov MSG_cur_time+4,cl      

mov al, sec  ;second
mov ah, 0
mov bl, 64h
div bl      ;divide ax by 64h
mov al, ah  ;move the remainder to al
mov ah, 0h 
mov bl, 0ah
div bl      ;divide ax by bl
mov ch, al
mov cl, ah

add cx, 3030h
mov MSG_cur_time+6,ch
mov MSG_cur_time+7,cl     


pop dx
pop cx 
pop bx
pop ax
pop bp
ret
;*****************************************************************
;-  /get_time                                              -  
;*****************************************************************



;*****************************************************************
;-  read_products                                               -
;-      cita podatke o proizvodima iz fajla i postavlja ih u tabele-
;-                                                              -
;-  parametri:                                                  -
;-      -nista                                                  -
;-  vraca:                                                      -
;-      -nista                                                  -
;*****************************************************************
;format linije u fajlu: " cen kol naziv/n"
read_products proc
    push ax
    push bx
    push cx
    push dx
    push di
    push bp
    mov dx, offset FILE_products ;ime fajla u dx
    mov ax, 3D00h           ;setovanje moda za otvaranje fajla
    int 21h                 ;otvaranje fajla
    jnc read_fwd2
    jmp error1                ;ako greska idi na error
read_fwd2:mov bx,ax               ;handle u bx
    ;Citanje fajla
    
    
    mov PROD_index_tmp,0
read_cen:mov cx, 3          ;broj bajtova u cx
    mov dx,offset PROD_num_tmp ;odrediste u dx
    mov ah,3Fh              ;mod za citanje
    int 21h                 ;citanje bajtova iz fajla
    jnc read_fwd1
    jmp error1                ;ako greska idi na error 
read_fwd1:cmp ax,0                ;ako je dosao do kraja fajla zatvori ga
    jne read_fwd3
    jmp clf
read_fwd3:mov al, PROD_index_tmp
    mov ah,0
    mov di,ax                      ;index trenutnog reda u tabeli u di
    mov al, PROD_num_tmp           ;prva cifra u al
    mov ah, 0
    sub al, 30h
    mov dl, 100
    mul dl                         ;cifra prebacena na mesto stotina
    mov byte ptr PROD_cen[di],al
    
    mov al, PROD_num_tmp+1           ;druga cifra u al
    mov ah, 0
    sub al, 30h
    mov dl, 10
    mul dl                         ;cifra prebacena na mesto desetica
    add byte ptr PROD_cen[di],al
    
    mov al, PROD_num_tmp           ;prva cifra u al
    mov ah, 0
    sub al, 30h                         ;cifra prebacena na mesto jedinica
    add byte ptr PROD_cen[di],al
    
    mov ah,42h              ;pomeranje kursora za 1 bajt
    mov al,1
    mov cx,0
    mov dx,1 
    int 21h
    
read_kol:mov cx,3
    mov dx,offset PROD_num_tmp ;odrediste u dx
    mov ah,3Fh              ;mod za citanje
    int 21h                 ;citanje bajtova iz fajla
    jnc read_fwd4
    jmp error1                ;ako greska idi na error
read_fwd4:cmp ax,0                ;ako je dosao do kraja fajla zatvori ga
    jne read_fwd5
    jmp clf
read_fwd5:mov al, PROD_index_tmp
    mov ah,0
    mov di,ax
    mov al, PROD_num_tmp           ;prva cifra u al
    mov ah, 0
    sub al, 30h
    mov dl, 100
    mul dl                         ;cifra prebacena na mesto stotina
    mov byte ptr PROD_kol[di],al
    
    mov al, PROD_num_tmp+1           ;druga cifra u al
    mov ah, 0
    sub al, 30h
    mov dl, 10
    mul dl                         ;cifra prebacena na mesto desetica
    add byte ptr PROD_kol[di],al
    
    mov al, PROD_num_tmp           ;prva cifra u al
    mov ah, 0
    sub al, 30h                         ;cifra prebacena na mesto jedinica
    add byte ptr PROD_kol[di],al
    
    mov ah,42h              ;pomeranje kursora za 1 bajt
    mov al,1
    mov cx,0
    mov dx,1 
    int 21h

read_name:mov al,byte ptr PROD_index_tmp
    mov ah,0
    mov dx,17
    mul dl
    mov bp,ax               ;sada je offset imena u tabeli u bp
    mov di,0                ;index karaktera u imenu u di karakteru se pristupa preko PROD_ime[bp+di]
    mov cx,1    
   
read_char:mov ah,3Fh        ;mod za citanje
    mov dx,offset PROD_char_tmp;odrediste u dx
    int 21h                 ;citanje bajtova iz fajla
    jc error1                ;ako greska idi na error
    cmp ax,0                ;ako je dosao do kraja fajla zatvori ga
    je clf
    mov dl, PROD_char_tmp
    cmp dl, 0Dh
    je finish_name
    mov ds:PROD_ime[bp+di],dl
    inc di
    cmp di,16
    je finish_name
    jmp read_char
finish_name:
    mov ah,42h              ;pomeranje kursora za 1 bajt
    mov al,1
    mov cx,0
    mov dx,1 
    int 21h
    
    mov byte ptr ds:PROD_ime[bp+di],0
    inc PROD_index_tmp
    cmp PROD_index_tmp, 100
    jge clf
    jmp read_cen
clf:mov ah,3Eh              ;mod za zatvaranje fajla
    int 21h                 ;zatvaranje fajla
    jc error1                ;ako greska idi na error
    jmp end16
error1:mov ax,0
    push 1225h
    call gotoxy
    add sp,2
    push 0021h
    push 0005h
    call write_character
    add sp,4
end16:pop bp
    pop di
    pop dx
    pop cx
    pop bx
    pop ax
    ret
endp

;*****************************************************************
;-  /read_products                                              -
;*****************************************************************
code ends
end start